﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using Emgu.CV;
using Emgu.CV.Structure;

namespace BKBIS
{
    // test subversion
    /// <summary>
    /// lớp này dùng để lọc,khử nhiễu trên ảnh
    /// </summary>
    class Filter
    {
        /// <summary>
        /// hàm này dùng để lọc bằng erode và dilate
        /// </summary>
        /// <param name="ImageInput"> ảnh đầu vào cần khử nhiễu </param>
        /// <returns>ảnh sau khi được khử nhiễu </returns>
        public Image<Gray, Byte> NoisyFilter(Image<Gray, Byte> ImageInput)
        {
            ImageInput = ImageInput.Erode(3);
            ImageInput = ImageInput.Dilate(3);
            //StructuringElementEx rect_erode = new StructuringElementEx(10, 10, 5, 5,
            //                                                        Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT);
            //CvInvoke.cvErode(ImageInput, ImageInput, rect_erode, 1);

            //StructuringElementEx rect_dilate = new StructuringElementEx(6, 6, 3, 3,
            //                                                            Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT);
            //CvInvoke.cvDilate(ImageInput, ImageInput, rect_dilate, 2);
            return ImageInput;
        }

       
        /// <summary>
        /// hàm này dùng để tách biên bằng canny và dò tìm viên thuốc hình tròn
        /// </summary>
        /// <param name="gray"> ảnh đầu vào</param>
        /// <returns> tọa độ viên thuốc dò được </returns>
        public CircleF[] CannyFilter(Image<Gray, Byte> gray,double thresh, double range_thresh)
        {
            double cannyThreshold = 100;
            double circleAccumulatorThreshold = 80;
           //CircleF[] circles = gray.HoughCircles(
           //     new Gray(cannyThreshold),
           //     new Gray(circleAccumulatorThreshold),
           //     2, //Resolution of the accumulator used to detect centers of the circles
           //     100.0, //min distance 
           //     1, //min radius
           //     0 //max radius
           //     )[0]; //Get the circles from the first channel

            CircleF[] circles = gray.HoughCircles(new Gray(thresh),new Gray(Math.Abs(thresh-range_thresh)),
                2, //Resolution of the accumulator used to detect centers of the circles
                100.0, //min distance 
                1, //min radius
                0 //max radius
                )[0];

       //   Image<Bgr,Byte> _bgrCircleImage = new Image<Bgr, byte>(gray.Width, gray.Height);
         //   foreach (CircleF circle in circles)
              //  _bgrCircleImage.Draw(circle, new Bgr(Color.Brown), 2);
            // imageBox4.Image = _bgrCircleImage;
//double cannyThresholdLinking = 40.0;
            // double cannyThresholdLinking = 10.0;
//Image<Gray, Byte> cannyEdges = gray.Canny(cannyThreshold, cannyThresholdLinking);
//LineSegment2D[] lines = cannyEdges.HoughLinesBinary(
            //    1, //Distance resolution in pixel-related units
//Math.PI / 45.0, //Angle resolution measured in radians.
//20, //threshold
             //   30, //min Line width
             //   10 //gap between lines
             //   )[0]; //Get the lines from the first channel
            // imageBox2.Image = cannyEdges;
          // imageBox2.Image = _bgrCircleImage;
            return circles;
        }
    }
}
